package com.mall.mapper;

import com.github.pagehelper.Page;
import com.mall.domain.dto.ItemPageQueryDTO;
import com.mall.domain.po.Item;
import com.mall.domain.vo.ItemVO;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * @author 勾新杰
 * @version 1.0
 * @date 2024/11/23 11:23
 */
@Mapper
public interface ItemMapper {

    /**
     * 新增商品
     * @param item 商品
     */
    @Insert("insert into item(category_id, name, description, price, stock, image, status, create_time, update_time) " +
            "VALUES (#{categoryId}, #{name}, #{description}, #{price}, #{stock}, #{image}, #{status},#{createTime}, #{updateTime})")
    void insert(Item item);

    /**
     * 修改商品
     * @param item 商品
     */
    void update(Item item);

    /**
     * 分页查询商品
     * @param itemPageQueryDTO 查询条件
     * @return 商品列表
     */
    Page<ItemVO> selectPage(ItemPageQueryDTO itemPageQueryDTO);

    /**
     * 根据分类id删除商品
     * @param categoryId 分类id
     */
    @Delete("delete from item where category_id = #{categoryId};")
    void deleteByCategoryId(Long categoryId);

    /**
     * 根据商品id删除商品
     * @param id 商品id
     */
    @Delete("delete from item where id = #{id};")
    void deleteById(Long id);

    /**
     * 批量删除商品
     * @param ids 商品id集合
     */
    void deleteByIds(List<Long> ids);

    /**
     * 根据商品id查询商品
     * @param id 商品id
     * @return 商品
     */
    @Select("select id, category_id, name, description, price, stock, image, status, create_time, update_time from item where id = #{id};")
    Item getById(Long id);

    /**
     * 减少商品库存
     * @param id 商品id
     * @param quantity 减少数量
     */
    @Update("update item set stock = stock - #{quantity} where id = #{id};")
    void deductStock(Long id, Integer quantity);

    /**
     * 增加商品库存
     * @param id 商品id
     * @param quantity 增加数量
     */
    @Update("update item set stock = stock + #{quantity} where id = #{id};")
    void inductStock(Long id, Integer quantity);

    /**
     * 商品详情
     * @param id 商品id
     * @return 商品
     */
    @Select("select item.id, item.category_id, item.name, item.description, " +
            "item.price, item.stock, item.image, item.status, item.create_time, " +
            "item.update_time, category.id, category.name, category.status, " +
            "category.create_time, category.update_time, category.name as categoryName " +
            "from item left join category on item.category_id = category.id where item.id = #{id}")
    ItemVO detail(Long id);
}
